package br.com.repositorio;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.com.dao.Dao;
import br.com.entidade.Animal;
import br.com.util.Constantes;
import br.com.util.OrganizadorNomeAnimal;

public class RepositorioAnimal {
	
	public Animal buscarAnimalPorId(Long id) {
		try{			
			return (Animal) Dao.getInstance().buscarPorId(Animal.class, id);
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarTodosOsAnimais() {
		try{
			List<Animal> cachorros = listarAnimaisPorNomeECategoria("", Constantes.CATEGORIA_CACHORRO);
			Collections.sort(cachorros, new OrganizadorNomeAnimal());
			List<Animal> gatos = listarAnimaisPorNomeECategoria("", Constantes.CATEGORIA_GATO);
			Collections.sort(gatos, new OrganizadorNomeAnimal());
			List<Animal> outros = listarAnimaisPorNomeECategoria("", Constantes.CATEGORIA_OUTRO);
			Collections.sort(outros, new OrganizadorNomeAnimal());
			List<Animal> animais = new ArrayList<Animal>(100);
			animais.addAll(cachorros);
			animais.addAll(gatos);
			animais.addAll(outros);
			
			return animais;
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisPorNome(String nome) {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorLike("nome", nome, Animal.class);
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisPorNomeECategoria(String nome, String categoria) {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorNomeECategoriaComLike(nome, categoria);
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimalSemCategoria(String nome, String categoria, int idade, String vacinado, String vermifugado, String especial, String raca, String sexo) {
		try{			
			return (List<Animal>) Dao.getInstance().buscarSemCategoriaAnimal(nome, categoria, idade, vacinado, vermifugado, especial, raca, sexo);
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisAdotados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.SIM, "adotado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisNaoAdotados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.NAO, "adotado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisVermifugados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.SIM, "vermifugado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisNaoVermifugados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.NAO, "vermifugado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisVacinados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.SIM, "vacinado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisNaoVacinados() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.NAO, "vacinado");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisEspeciais() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.SIM, "adocaoEspecial");
		}catch(Exception e){
			return null;
		}
	}
	
	public List<Animal> listarAnimaisNaoEspeciais() {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, Constantes.NAO, "adocaoEspecial");
		}catch(Exception e){
			return null;
		}
	}

	public List<Animal> listarAnimaisPorCategoria(String categoria) {
		try{			
			return (List<Animal>) Dao.getInstance().buscarPorValorDeColunaString(Animal.class, categoria, "categoria");
		}catch(Exception e){
			return null;
		}
	}
	
	public String listarNecessidadeEspecialPorAnimal(Long idAnimal) {
		try{			
			return Dao.getInstance().buscarNecessidadeEspecial(idAnimal);
		}catch(Exception e){
			return null;
		}
	}
	
	public void cadastrarAnimal(Animal animal) {
		try{			
			animal.setStatus(Constantes.ATIVO);
			Dao.getInstance().salvarObjeto(animal);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void inativarAnimal(Long id) {
		try{			
			Animal animal = (Animal) Dao.getInstance().buscarPorChaveUnicaLong(Animal.class, id, "id");
			animal.setStatus(Constantes.INATIVO);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void atualizarAnimal(Animal animal) {
		try{			
			Dao.getInstance().atualizarObjeto(animal);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
}
